package elka.sag.logisticsystem.service;

import java.util.List;

import elka.sag.logisticsystem.bean.*;
import elka.sag.logisticsystem.bean.Order.OrderStatus;

/**
 * Zarz�dza zleceniami. Umo�liwia odczyt/zapis/modyfikacje.
 * @author Wojtek
 *
 */
public interface RepositoryService {
	/**
	 * Zwraca zlecenia, ktore maja byc przetwarzane w procesie biznesowym
	 * @return wszystkie zlecenia, ktorych status pozwala na realizacje kolejnych krokow procesu biznesowego
	 */
	public List<Order> getOrderForProcessing();

	/**
	 * Pobiera konfiguracje statusow
	 * @return
	 */
	public List<BusinesProcesStatus> getBusinesProcesStatuses();
	
//	/**
//	 * Aktualizuje dane zamowienia
//	 * @param order
//	 */
//	public void updateOrder(Order order);

    /**
     * Aktualizuje pola zamowienia: status, czy_przetwarzane
     * @param order
     */
    public void updateOrderStatusAndProcess(Order order);

    /**
     * Usuwa dokumenty danego zamowienia.
     * @param orderId
     */
    public void removeOderDocuments(long orderId);

    /**
     * Przypisuje danemu zamowieniu wygenerowane dokumenty.
     * @param documents
     * @param orderId
     */
    public void setDocuments(List<Document> documents, long orderId);

    /**
     * Zwraca liste dokumentow danego zamowienia.
     *
     * @param orderId
     * @return
     */
    public List<Document> getDocuments(long orderId);

    /**
     * Zwraca towary danego zamowienia, ktore nalezy dostarczyc aby bylo
     * kompletne.
     *
     * @param orderId
     */
    public List<Article> getOrderArticles(long orderId);

    /**
     * Aktualizuje pola tabeli towary_zamowienia - dla danego id zamowienia
     * ustawia wartosc czy_zarezerwowane na 'true', co oznacza dolaczenie
     * danego towaru do zamowienia.
     *
     * @param orderArticles
     * @param orderId
     */
    public void setOrderArticles(List<Article> orderArticles, long orderId);

    /**
     * Zwraca 'true' jesli wszystkie towary danego zamowienia sa zarezerwowane
     * (dolaczone do zamowienia).
     *
     * @param orderId
     */
    public boolean isOrderComplete(long orderId);

	/**
	 * Pobiera zamowienie po podnym id zamowienia
	 * @param orderId
	 * @return
	 */
	public Order getOrderById(Long orderId);

	/**
	 * Zwraca unikalne nazwy magazynow
	 * @return
	 */
	public List<String> getWarehouseNames();

	/**
	 * Pobiera nastepny status zamowienia na podstawie konfiguracji procesu biznesowego
	 * @param status
	 * @return
	 */
	public OrderStatus getNextStatus(OrderStatus status);

	/**
	 * Zwraca wartosc parametru o danej nazwie
	 * @param brokenNotification
	 * @return
	 */
	public String getParam(String brokenNotification);

    /**
     * Probuje zarezerwowac dany towar w danym magazynie.
     * Jesli towar jest dostepny to jego liczba pomniejszana zostanie o 1
     * i zwrocona zostanie wartosc 'true'. Jest to rownoznaczne z dolaczeniem towaru do zamowienia.
     *
     * @param warehouseName
     * @param articleId
     * @return
     */
    public boolean reserveArticle(String warehouseName, int articleId);

    /**
     * Zwieksza liczbe danego towaru w danym magazynie o 1.
     *
     * @param warehouseName
     * @param articleId
     */
    public void produceArticle(String warehouseName, int articleId);

    /**
     * Zwraca liczbe danych artykulow w danym magazynie.
     *
     * @param warehouseName
     * @param articleId
     * @return
     */
    public int getNumberOfArticles(String warehouseName, int articleId);


}
